//
//  HMHomeViewModel.swift
//  swift-新浪微博0
//
//  Created by 赵玉忠 on 16/9/3.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import SDWebImage

class HMHomeViewModel: NSObject {
    
    // 当前视图模型对应的模型
    var statusArray: [HMStatusViewModel]?
    
    /// 加载数据
    func loadData(isPullUp: Bool, completion: @escaping (Bool, Int)->()) {
        let urlString = "https://api.weibo.com/2/statuses/friends_timeline.json"
        
        // 默认maxId 为0
        var maxId: Int64 = 0
        var sinceId: Int64 = 0
        
        // 如果是上拉加载
        if isPullUp {
            // 取到数组中最后一个模型的id
            if let id = statusArray?.last?.status?.id {
                // 将id赋值给 maxid
                // 减1的原因是因为新浪微博会返回比maxId小于或者等于的微博
                maxId = id - 1
            }
        }else{
            // 如果不是上拉加载 ，那么就是下拉刷新
            if let id = statusArray?.first?.status?.id {
                sinceId = id
            }
        }
        
        let params = [
            "max_id": "\(maxId)",
            "since_id": "\(sinceId)",
            "access_token": HMUserAccountViewModel.sharedModel.accessToken ?? ""
        ]
        
        HMNetworkTools.sharedTools.request(method: .Get, urlString: urlString, parameters: params) { (response, error) in
            
            if error != nil {
                print("请求错误\(error)")
                completion(false, 0)
                return
            }
            
            // 对数据进行解析
            // 字典转模型
            guard let dictArray = (response! as! [String: Any])["statuses"] as? [[String: Any]] else {
                return
            }
            // 将字典数组转模型数据
            let modelArray = NSArray.yy_modelArray(with: HMStatus.classForCoder(), json: dictArray) as? [HMStatus]
            
            var tempArray = [HMStatusViewModel]()
            
            for status in modelArray! {
                
                let viewModel = HMStatusViewModel()
                viewModel.status = status
                tempArray.append(viewModel)
            }
            
            print("加载回来：\(tempArray.count) 条")
            
            // 如果结果数组为nil，就去初始化
            if self.statusArray == nil {
                self.statusArray = [HMStatusViewModel]()
            }
            
            if isPullUp {
                // 是上拉加载
                // 要把数据拼接到数组的后面
                self.statusArray = self.statusArray! + tempArray
            }else{
                // 不是上拉加载-->就是下拉刷新
                self.statusArray = tempArray + self.statusArray!
            }
            
            // 使用属性记住当前模型数组
            // self.statusArray = tempArray
            
            
            // 刷新数据
            // self.tableView.reloadData()
            // 通过控制器刷新数据
            
            // 要赶在下面这一句代码调用之前去把单张图片下载好
            // --> 在这个位置去下载图片
            // --> 同步下载还是异步下载？？？
            // 异步下载
            self.cacheSingleImage(status: tempArray, completion: completion)
            // 这一句代码就是告诉控制器，数据已经准备好了
            // completion(true)
        }
    }
    
    private func cacheSingleImage(status: [HMStatusViewModel], completion: @escaping (Bool, Int)->()) {
        
        // 初始化一个组
        let group = DispatchGroup.init()
        
        for value in status {
            
            // 如果判断微博模型中的图片张数为1呢?
            guard let pic_urls = (value.status?.pic_urls?.count == 1) ? value.status?.pic_urls : value.status?.retweeted_status?.pic_urls, pic_urls.count == 1 else {
                // 继续下一次循环
                continue
            }
            
            // 取到该单张图片的模型
            let photoInfo = pic_urls.first!
            // 取到模型里面的图片地址
            let urlString = photoInfo.thumbnail_pic
            // 初始成url
            let url = URL(string: urlString ?? "")
            // 下载图片
            group.enter()
            SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (image, error, _, _, _) in
                // 使用模型去记录图片的大小
                photoInfo.size = image?.size
                print("下载完成:\(urlString)")
                // 出组
                group.leave()
            })
        }
        
        group.notify(queue: DispatchQueue.main) {
            print("所有的单张图片都下载完成")
            completion(true, status.count)
        }
    }
}









